package sistemioperativi.esami.ristorante;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class PortaPiattiLC extends PortaPiatti{

	private Lock l = new ReentrantLock();
	private Condition possoInserire = l.newCondition();
	private Condition possoPrelevare = l.newCondition();
	
	public PortaPiattiLC(int numPiatti){
		super(numPiatti);
	}
	

	public void put(int numPiatti) throws InterruptedException{
		l.lock();
		
		try{
		while(this.numPiatti + numPiatti <= MAX_PIATTI){
			possoInserire.await();
		}
		this.numPiatti += numPiatti;
		if(numPiatti == 1){
			possoPrelevare.signal();
		}else{
			possoPrelevare.signalAll();
		}
		}finally{l.unlock();};
	}
	
	public void get() throws InterruptedException{
		l.lock();
		
		try{
			
			while(numPiatti == 0){
				possoPrelevare.await();
			}
			
			numPiatti--;
			possoInserire.signal();
			
		}finally{l.unlock();};
	}
	
}
